#ifndef _ANSI_H
#define _ANSI_H

#include "types.h"

// ANSI转义序列基础定义
#define ANSI_ESC        "\033"
#define ANSI_CSI        "\033["

// 光标控制序列
#define ANSI_CURSOR_HOME    "\033[H"
#define ANSI_CURSOR_UP      "\033[A"
#define ANSI_CURSOR_DOWN    "\033[B"
#define ANSI_CURSOR_FORWARD "\033[C"
#define ANSI_CURSOR_BACK    "\033[D"

// 清屏序列
#define ANSI_CLEAR_SCREEN   "\033[2J"
#define ANSI_CLEAR_LINE     "\033[2K"
#define ANSI_CLEAR_TO_EOL   "\033[0K"
#define ANSI_CLEAR_TO_BOL   "\033[1K"
#define ANSI_CLEAR_LINE_ALL "\033[2K"

// 光标位置保存与恢复
#define ANSI_CURSOR_SAVE    "\033[s"
#define ANSI_CURSOR_RESTORE "\033[u"

// 颜色基础代码
#define ANSI_COLOR_RESET    "\033[0m"
#define ANSI_COLOR_BOLD     "\033[1m"
#define ANSI_COLOR_UNDERLINE "\033[4m"
#define ANSI_COLOR_BLINK    "\033[5m"
#define ANSI_COLOR_REVERSE  "\033[7m"

// 前景色代码
#define ANSI_FG_BLACK       "\033[30m"
#define ANSI_FG_RED         "\033[31m"
#define ANSI_FG_GREEN       "\033[32m"
#define ANSI_FG_YELLOW      "\033[33m"
#define ANSI_FG_BLUE        "\033[34m"
#define ANSI_FG_MAGENTA     "\033[35m"
#define ANSI_FG_CYAN        "\033[36m"
#define ANSI_FG_WHITE       "\033[37m"
#define ANSI_FG_DEFAULT     "\033[39m"

// 背景色代码
#define ANSI_BG_BLACK       "\033[40m"
#define ANSI_BG_RED         "\033[41m"
#define ANSI_BG_GREEN       "\033[42m"
#define ANSI_BG_YELLOW      "\033[43m"
#define ANSI_BG_BLUE        "\033[44m"
#define ANSI_BG_MAGENTA     "\033[45m"
#define ANSI_BG_CYAN        "\033[46m"
#define ANSI_BG_WHITE       "\033[47m"
#define ANSI_BG_DEFAULT     "\033[49m"

// 亮色前景
#define ANSI_FG_BRIGHT_BLACK   "\033[90m"
#define ANSI_FG_BRIGHT_RED     "\033[91m"
#define ANSI_FG_BRIGHT_GREEN   "\033[92m"
#define ANSI_FG_BRIGHT_YELLOW  "\033[93m"
#define ANSI_FG_BRIGHT_BLUE    "\033[94m"
#define ANSI_FG_BRIGHT_MAGENTA "\033[95m"
#define ANSI_FG_BRIGHT_CYAN    "\033[96m"
#define ANSI_FG_BRIGHT_WHITE   "\033[97m"

// 亮色背景
#define ANSI_BG_BRIGHT_BLACK   "\033[100m"
#define ANSI_BG_BRIGHT_RED     "\033[101m"
#define ANSI_BG_BRIGHT_GREEN   "\033[102m"
#define ANSI_BG_BRIGHT_YELLOW  "\033[103m"
#define ANSI_BG_BRIGHT_BLUE    "\033[104m"
#define ANSI_BG_BRIGHT_MAGENTA "\033[105m"
#define ANSI_BG_BRIGHT_CYAN    "\033[106m"
#define ANSI_BG_BRIGHT_WHITE   "\033[107m"

/**
 * 清除整个屏幕并将光标移动到左上角
 */
void clear_screen(void);

/**
 * 将光标移动到指定位置
 * @param row 行号 (从1开始)
 * @param col 列号 (从1开始)
 */
void set_cursor_position(int row, int col);

/**
 * 移动光标到指定位置 (从0开始的坐标)
 * @param x 列号 (从0开始)
 * @param y 行号 (从0开始)
 */
void goto_xy(int x, int y);

/**
 * 设置前景色
 * @param color 颜色代码 (0-7)
 */
void set_foreground_color(int color);

/**
 * 设置背景色
 * @param color 颜色代码 (0-7)
 */
void set_background_color(int color);

/**
 * 重置所有文本属性为默认值
 */
void reset_color(void);

/**
 * 清除当前行
 */
void clear_line(void);

/**
 * 清除从光标到行尾的内容
 */
void clear_to_end_of_line(void);

/**
 * 清除从光标到行首的内容
 */
void clear_to_beginning_of_line(void);

/**
 * 保存当前光标位置
 */
void save_cursor_position(void);

/**
 * 恢复之前保存的光标位置
 */
void restore_cursor_position(void);

/**
 * 设置文本为粗体
 */
void set_bold(void);

/**
 * 设置文本为下划线
 */
void set_underline(void);

/**
 * 设置文本为闪烁
 */
void set_blink(void);

/**
 * 设置文本为反色显示
 */
void set_reverse_video(void);

/**
 * 移动光标向上
 * @param n 移动的行数
 */
void cursor_up(int n);

/**
 * 移动光标向下
 * @param n 移动的行数
 */
void cursor_down(int n);

/**
 * 移动光标向右
 * @param n 移动的列数
 */
void cursor_forward(int n);

/**
 * 移动光标向左
 * @param n 移动的列数
 */
void cursor_back(int n);

#endif // _ANSI_H
